package com.dbms.parser;

import com.dbms.common.Position;

/**
 * 词法分析器（SqlLexer）生成的Token（单词单元）类
 * 是词法分析与语法分析之间的桥梁，封装了单个语法单元的核心信息：
 * - 类型（如关键字、标识符、常量等）
 * - 原始字符串值（词素）
 * - 在源代码中的位置（用于错误定位和调试）
 */
public class Token {
    // Token的类型分类（通过TokenType枚举定义，如KEYWORD、IDENTIFIER、CONSTANT等）
    // 用于语法分析时快速判断当前单元的语法角色
    private final TokenType type;

    // 词素（lexeme）：Token对应的原始字符串值
    // 例如：关键字"SELECT"、标识符"user_name"、常量"123"或"'admin'"
    private final String lexeme;

    // Token在源代码中的位置信息（包含行号、列号、字符索引）
    // 主要用于错误提示（如"在第3行第5列发现语法错误"）和调试
    private final Position position;

    /**
     * 构造方法：创建一个Token实例
     * @param type Token的类型（如TokenType.KEYWORD、TokenType.CONSTANT）
     * @param lexeme Token对应的原始字符串（词素）
     * @param position Token在源代码中的位置信息
     */
    public Token(TokenType type, String lexeme, Position position) {
        this.type = type;
        this.lexeme = lexeme;
        this.position = position;
    }

    /**
     * 获取Token的类型
     * @return TokenType枚举值，表示当前Token的语法分类
     */
    public TokenType getType() {
        return type;
    }

    /**
     * 获取Token的词素（原始字符串值）
     * @return 词素字符串（如"WHERE"、"age"、"25"）
     */
    public String getLexeme() {
        return lexeme;
    }

    /**
     * 获取Token在源代码中的位置信息
     * @return Position对象，包含行号、列号等定位信息
     */
    public Position getPosition() {
        return position;
    }

    /**
     * 重写toString方法：格式化Token信息，便于日志输出和调试
     * 格式：[类型, 词素, 行: 行号, 列: 列号]
     * @return 格式化的Token字符串
     */
    @Override
    public String toString() {
        return String.format("[%s, %s, 行: %d, 列: %d]",
                type,
                lexeme,
                position.getLine(),
                position.getColumn());
    }
}